package com.haredot.utils;

import java.util.Arrays;
import java.util.StringJoiner;

public class ConvertorIpUtils {
    /**
     * 根据IP地址转换成对应的数字
     */
    public static Long convertIpToNumber(String ip) {
        if (ip == null) return null;
        // 检查传入的是否是 IP 地址
        String regex = "^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$";

        if (!ip.matches(regex)) {
            throw new RuntimeException("ip地址格式不正确");
        }
        // 通过 \. 拆分 IP 地址
        String[] split = ip.split("\\.");

        StringBuilder sb = new StringBuilder();
        // 遍历 四部分内容
        for (String part : split) {
            // 将 part 转成 二进制的标识形式
            String bin = padZeroLeft(Integer.toBinaryString(Integer.parseInt(part)), 8);
            sb.append(bin);
        }
        return Long.valueOf(sb.toString(), 2);
    }

    /**
     * 将一个数字转换成 IP地址
     *
     * @param num
     * @return
     */
    public static String convertNumberToIp(Long num) {
        if (num == null) return null;
        // 将 数字 转换为 二进制
        String bin = padZeroLeft(Long.toBinaryString(num), 32);
        int[] parts = new int[4];
        // 截取字符串
        for (int i = 0; i < parts.length; i++) {
            parts[i] = Integer.parseInt(bin.substring(i * 8, i * 8 + 8), 2);
        }
        StringJoiner joiner = new StringJoiner(".");
        Arrays.stream(parts).mapToObj(String::valueOf).forEach(joiner::add);
        return joiner.toString();
    }

    private static String padZeroLeft(String bin, int length) {
        String prefix = null;
        if (bin.length() < length) {
            int count = length - bin.length();
            prefix = "0".repeat(count);
        }
        return prefix != null ? prefix + bin : bin;
    }

}
